#pragma once
#include "lio_ndt/method/registration.h"
#include <pcl/registration/ndt.h>
#include <pcl/common/transforms.h>
#include <mutex>
#include <limits>

namespace lio_ndt {

// 确保正确继承Registration，且所有纯虚函数声明完整
class PCLNDT : public Registration {
public:
    using PointT = Registration::PointT;
    using CloudPtr = Registration::CloudPtr;

    // 构造函数声明（无参数，与源文件一致）
    PCLNDT();
    // 析构函数（override，与基类一致）
    ~PCLNDT() override = default;

    // 基类纯虚函数声明（必须与实现一致）
    bool SetTargetCloud(const CloudPtr& target) override;
    bool ScanMatch(const CloudPtr& source,
                   const Eigen::Matrix4f& predict_pose,
                   CloudPtr& transformed_source,
                   Eigen::Matrix4f& result_pose) override;
    double GetFitnessScore() const override;

    // 成员函数声明（参数类型、返回值必须与实现一致）
    void SetResolution(double res);
    void SetMaximumIterations(int it);
    void SetTransformationEpsilon(double eps);

private:
    pcl::NormalDistributionsTransform<PointT, PointT> ndt_;
    CloudPtr target_;
    std::mutex mutex_;

    double resolution_;   // 与源文件变量名一致
    int max_iter_;        // 与源文件变量名一致
    double trans_eps_;    // 与源文件变量名一致
    double last_fitness_; // 与源文件变量名一致
};

} // namespace lio_ndt
